`timescale 1ns / 100ps

module freq_div_in_pul_tb ();

parameter SYSCLK_PERIOD = 20; // 系统时钟周期为20ns，即50MHz

parameter		CLK_FREQ_MHZ = 5;		//产生us脉冲信号的输入时钟频率，单位MHz
parameter		MS_DIV_COEF = 10;		//产生毫秒脉冲的分频系数
parameter		S_DIV_COEF = 10;		//产生秒脉冲的分频系数

wire			us_p;					//微秒脉冲
wire			ms_p;					//毫秒脉冲
wire			s_p;					//秒脉冲

reg SYSCLK; // 模拟时钟信号
reg SYSRESET_N; // 模拟复位信号，低电平有效

// 初始化时钟信号和复位信号
initial begin
    SYSCLK = 1'b0;
    SYSRESET_N = 1'b0;
end

// 导出仿真数据，用于显示波形图
initial begin
    $dumpfile("output/freq_div_in_pul_tb.vcd");
    $dumpvars(0, freq_div_in_pul_tb);
end

initial begin
    #SYSCLK_PERIOD SYSRESET_N = 1'b1; // 延时1个时钟周期后复位信号失效
    #10_000 $stop; // 10_000_000个时间单位(10ms)后仿真结束
end

always @ (*) begin
    #(SYSCLK_PERIOD / 2.0) SYSCLK <= ~SYSCLK; // 每半个时钟周期，时钟信号切换
end

//=======================================================
//产生微秒脉冲信号
freq_div_in_clk #(
	.DIV_COEF	(CLK_FREQ_MHZ)
)
us_pulse_inst
(
	.clk_50m	(SYSCLK),			//系统时钟50MHz
	.rst_n		(SYSRESET_N),				//复位信号输入，低电平有效
	.out_p		(us_p)					//分频DIV_COEF倍后输出信号
);

//=======================================================
//产生毫秒脉冲信号
freq_div_in_pul #(
	.DIV_COEF	(MS_DIV_COEF)
)
ms_pulse_inst
(
	.clk_50m	(SYSCLK),			//系统时钟50MHz
	.rst_n		(SYSRESET_N),				//复位信号输入，低电平有效
	.in_p		(us_p),					//输入脉冲信号
	.out_p		(ms_p)					//分频后输出信号
);

//=======================================================
//产生秒脉冲信号
freq_div_in_pul #(
	.DIV_COEF	(S_DIV_COEF)
)
s_pulse_inst
(
	.clk_50m	(SYSCLK),			//系统时钟50MHz
	.rst_n		(SYSRESET_N),				//复位信号输入，低电平有效
	.in_p		(ms_p),					//输入脉冲信号
	.out_p		(s_p)					//分频后输出信号
);

endmodule  //freq_div_in_pul_tb